﻿using System;
using System.Drawing;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Venta : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Nuevo();
            cargarTiposFactura();
            cargarTiposPago();

            if (User.IsInRole("administrador"))
            {
                buscarGrillaClientes(0);
            }
            else
            {
                buscarGrillaClienteUsuario(0);
            }          
            buscarGrillaCDs(0);
           
        }
    }

    public void cargarTiposFactura()
    {
        cboTipoFactura.DataSource = DAO.DAOTipoFactura.getTodas();
        cboTipoFactura.DataTextField = "nombre";
        cboTipoFactura.DataValueField = "id_tipo_factura";
        cboTipoFactura.DataBind();
        cboTipoFactura.Items.Insert(0, new ListItem("(Sin Seleccion)", ""));
        cboTipoFactura.SelectedIndex = 0;
    }

    public void cargarTiposPago()
    {
        cboTipoPago.DataSource = DAO.DAOTipoPago.getTodas();
        cboTipoPago.DataTextField = "nombre";
        cboTipoPago.DataValueField = "id_tipo_pago";
        cboTipoPago.DataBind();
        cboTipoPago.Items.Insert(0, new ListItem("(Sin Seleccion)", ""));
        cboTipoPago.SelectedIndex = 0;
    }

    public void cargarGrillaDetalles()
    {
        gvDetalle.DataSource = detallesEnSession;
        gvDetalle.DataKeyNames = new string[] { "id_cd" };
        gvDetalle.DataBind();
    }

    public void Nuevo()
    {
        List<Entidad.EntidadDetalleFactura> detalles = new List<Entidad.EntidadDetalleFactura>();
        detallesEnSession = detalles;

        txtFecha.Text = DateTime.Now.Date.ToShortDateString();
        txtFecha.Enabled = false;
        txtFecha.BackColor = Color.White;
        txtNroFactura.Text = DAO.DAOFactura.getUltimoId().ToString();
        txtNroFactura.Enabled = false;
        txtNroFactura.BackColor = Color.White;
        txtTotal.Text = "0";
        txtTotal.Enabled = false;
        txtTotal.BackColor = Color.White;

        txtNroDocumento.Text = string.Empty;
        txtNroDocumento.Enabled = false;
        txtApellido.Text = string.Empty;
        txtApellido.Enabled = false;
        txtNombre.Text = string.Empty;
        txtNombre.Enabled = false;
        BackColorCamposCliente(Color.Gray);

        txtCodigoCD.Text = string.Empty;
        txtCodigoCD.Enabled = false;
        txtTitulo.Text = string.Empty;
        txtTitulo.Enabled = false;
        txtPrecio.Text = string.Empty;
        txtPrecio.Enabled = false;
        txtCantidad.Text = string.Empty;
        txtCantidad.Enabled = false;
        BackColorCamposCD(Color.Gray);

        cboTipoFactura.SelectedIndex = 0;
        cboTipoPago.SelectedIndex = 0;

        btnAgregar.Enabled = false;
        btnQuitar.Enabled = false;
        btnConfirmar.Enabled = false;

        alertaStock.Visible = false;
        alertaTipoFactura.Visible = false;
        alertaTipoPago.Visible = false;
        alertaExito.Visible = false;

    }

    private void BackColorCamposCD(Color color)
    {
        txtCodigoCD.BackColor = color;
        txtTitulo.BackColor = color;
        txtPrecio.BackColor = color;
        txtCantidad.BackColor = color;
    }

    private void BackColorCamposCliente(Color color)
    {
        txtNroDocumento.BackColor = color;
        txtApellido.BackColor = color;
        txtNombre.BackColor = color;
    }

    private List<Entidad.EntidadDetalleFactura> detallesEnSession
    {
        get
        {
            if (Session["detallesEnSesion"] != null)
                return (List<Entidad.EntidadDetalleFactura>)Session["detallesEnSesion"];
            else
                return null;
        }
        set
        {
            Session["detallesEnSesion"] = value;
        }
    }

    private List<Entidad.EntidadCD> CDsEnSession
    {
        get
        {
            if (Session["CDsEnSession"] != null)
                return (List<Entidad.EntidadCD>)Session["CDsEnSession"];
            else
                return null;
        }
        set
        {
            Session["CDsEnSession"] = value;
        }
    }

    private List<Entidad.EntidadClienteQuery> ClientesEnSession
    {
        get
        {
            if (Session["ClientesEnSession"] != null)
                return (List<Entidad.EntidadClienteQuery>)Session["ClientesEnSession"];
            else
                return null;
        }
        set
        {
            Session["ClientesEnSession"] = value;
        }
    }

    private void buscarGrillaCDs(int indicePagina)
    {
        List<Entidad.EntidadCD> cds = DAO.DAOCD.getTodasGrillaVenta();
        CDsEnSession = cds;
        gvCD.DataSource = cds;
        gvCD.DataKeyNames = new string[] { "id_cd" };
        gvCD.PageIndex = indicePagina;
        gvCD.DataBind();
    }

    protected void gvCD_SelectedIndexChanged(object sender, EventArgs e)
    {        
        int id_cd = (int)gvCD.SelectedDataKey.Value;
        Entidad.EntidadCD cd = DAO.DAOCD.Buscar(id_cd);

        if (cd != null)
        {
            ViewState["id_cd"] = id_cd;
            txtCodigoCD.Text = cd.codigo_cd.ToString();         
            txtTitulo.Text = cd.titulo;        
            txtPrecio.Text = cd.precio_venta.ToString().Replace(",", ".");          
            txtCantidad.Enabled = true;
            txtCantidad.Text = string.Empty;
            BackColorCamposCD(Color.White);
            btnAgregar.Enabled = true;

            if (ViewState["id_cd_detalle"] != null)           
                ViewState["id_cd_detalle"] = null;
            
        }

    }

    protected void gvCD_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        gvCD.DataSource = CDsEnSession;
        gvCD.DataKeyNames = new string[] { "id_cd" };
        gvCD.PageIndex = e.NewPageIndex;
        gvCD.DataBind();

    }

    private void buscarGrillaClientes(int indicePagina)
    {
        List<Entidad.EntidadClienteQuery> clientes = DAO.DAOCliente.getTodosGrillaVenta();
        ClientesEnSession = clientes;
        gvClientes.DataSource = clientes;
        gvClientes.DataKeyNames = new string[] { "id_cliente" };
        gvClientes.PageIndex = indicePagina;
        gvClientes.DataBind();
    }

    private void buscarGrillaClienteUsuario(int indicePagina)
    {
        int id_usuario = DAO.DAOUsuario.getIdUsuario(Context.User.Identity.Name);
        List<Entidad.EntidadClienteQuery> clientes = DAO.DAOCliente.BuscarPorUsuarioGrillaVenta(id_usuario);
        ClientesEnSession = clientes;
        gvClientes.DataSource = clientes;
        gvClientes.DataKeyNames = new string[] { "id_cliente" };
        gvClientes.PageIndex = indicePagina;
        gvClientes.DataBind();
    }

    protected void gvClientes_SelectedIndexChanged(object sender, EventArgs e)
    {
        int clienteID = (int)gvClientes.SelectedDataKey.Value;
        Entidad.EntidadClienteQuery cliente = DAO.DAOCliente.BuscarParaVenta(clienteID);
        if (cliente != null)
        {
            txtNroDocumento.Text = cliente.numero_documento.ToString();           
            txtApellido.Text = cliente.apellido;           
            txtNombre.Text = cliente.nombre;
            BackColorCamposCliente(Color.White);
            ViewState["id_cliente"] = clienteID;

        }

    }
    protected void gvClientes_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        gvClientes.DataSource = ClientesEnSession;
        gvClientes.DataKeyNames = new string[] { "id_cliente" };
        gvClientes.PageIndex = e.NewPageIndex;
        gvClientes.DataBind();

    }

    protected void gvDetalle_SelectedIndexChanged(object sender, EventArgs e)
    {
        int id_cd = (int)gvDetalle.SelectedDataKey.Value;
        Entidad.EntidadCD cd = DAO.DAOCD.Buscar(id_cd);
        if (cd != null)
        {
            ViewState["id_cd_detalle"] = id_cd;
            txtCodigoCD.Text = cd.codigo_cd.ToString();
            txtTitulo.Text = cd.titulo;
            txtCantidad.Enabled = true;
            BackColorCamposCD(Color.White);
            btnAgregar.Enabled = true;
            btnQuitar.Enabled = true;
            foreach (Entidad.EntidadDetalleFactura item in detallesEnSession)
            {
                if (item.id_cd == id_cd)
                {
                    txtCantidad.Text = item.cantidad.ToString();
                    txtPrecio.Text = item.precio.ToString().Replace(",", ".");
                    break;
                }
            }

            if (ViewState["id_cd"] != null)
                ViewState["id_cd"] = null;
        }

    }

    protected void btnAgregar_Click(object sender, EventArgs e)
    {
        if (!IsValid)
            return;

        alertaStock.Visible = false;

        if (ViewState["id_cd"] != null)
        {
            bool flag = false;
            Entidad.EntidadCD cd = DAO.DAOCD.Buscar((int)ViewState["id_cd"]);
            if (int.Parse(txtCantidad.Text.ToString()) > cd.stock)
            {
                alertaStock.Visible = true;
                return;
            }

            if (detallesEnSession.Count != 0)
            {
                foreach (Entidad.EntidadDetalleFactura item in detallesEnSession)
                {
                    if (item.id_cd == cd.id_cd)
                    {
                        item.cantidad += int.Parse(txtCantidad.Text.ToString());
                        item.subtotal = item.cantidad * item.precio;
                        flag = true;
                        break;
                    }
                }
            }

            if (flag == false)
            {
                Entidad.EntidadDetalleFactura df = new Entidad.EntidadDetalleFactura();
                df.cantidad = int.Parse(txtCantidad.Text.ToString());
                df.id_cd = cd.id_cd;
                df.codigo_cd = cd.codigo_cd;
                df.titulo = cd.titulo;
                df.precio = cd.precio_venta;
                df.subtotal = df.cantidad * df.precio;             
                detallesEnSession.Add(df);
            }
                
            float? total = 0;
            foreach (Entidad.EntidadDetalleFactura item in detallesEnSession)
            {
                total += item.precio * item.cantidad;
            }
            txtTotal.Text = total.ToString().Replace(",", ".");

            gvDetalle.DataSource = detallesEnSession;
            gvDetalle.DataKeyNames = new string[] { "id_cd" };
            gvDetalle.DataBind();

            txtCodigoCD.Text = string.Empty;         
            txtTitulo.Text = string.Empty;         
            txtPrecio.Text = string.Empty;      
            txtCantidad.Text = string.Empty;
            BackColorCamposCD(Color.Gray);
           

            txtCantidad.Enabled = false;
            btnAgregar.Enabled = false;
            btnQuitar.Enabled = false;
            ViewState["id_cd"] = null;          

        }
        else if (ViewState["id_cd_detalle"] != null)
        {
            Entidad.EntidadCD cd = DAO.DAOCD.Buscar((int)ViewState["id_cd_detalle"]);
            if (int.Parse(txtCantidad.Text.ToString()) > cd.stock)
            {
                alertaStock.Visible = true;
                return;
            }

            if (detallesEnSession.Count != 0)
            {
                foreach (Entidad.EntidadDetalleFactura item in detallesEnSession)
                {
                    if (item.id_cd == cd.id_cd)
                    {
                        item.cantidad = int.Parse(txtCantidad.Text.ToString());
                        item.subtotal = item.cantidad * item.precio;                    
                        break;
                    }
                }
            }

            float? total = 0;
            foreach (Entidad.EntidadDetalleFactura item in detallesEnSession)
            {
                total += item.precio * item.cantidad;
            }
            txtTotal.Text = total.ToString().Replace(",", ".");

            gvDetalle.DataSource = detallesEnSession;
            gvDetalle.DataKeyNames = new string[] { "id_cd" };
            gvDetalle.DataBind();

            txtCodigoCD.Text = string.Empty;
            txtTitulo.Text = string.Empty;
            txtPrecio.Text = string.Empty;
            txtCantidad.Text = string.Empty;
            BackColorCamposCD(Color.Gray);


            txtCantidad.Enabled = false;
            btnAgregar.Enabled = false;
            btnQuitar.Enabled = false;
            ViewState["id_cd_detalle"] = null;

        }

        if (detallesEnSession.Count != 0)
        {
            btnConfirmar.Enabled = true;
        }


    }

    protected void btnQuitar_Click(object sender, EventArgs e)
    {
        if (ViewState["id_cd_detalle"] != null)
        {
            int id_cd_detalle = (int)ViewState["id_cd_detalle"];
            for (int i = 0; i < detallesEnSession.Count; i++)
            {
                if (detallesEnSession.ElementAt(i).id_cd == id_cd_detalle)
                {                
                    detallesEnSession.RemoveAt(i);
                    break;
                }
            }

            float? total = 0;
            foreach (Entidad.EntidadDetalleFactura item in detallesEnSession)
            {
                total += item.precio * item.cantidad;
            }
            txtTotal.Text = total.ToString().Replace(",", ".");

            gvDetalle.DataSource = detallesEnSession;
            gvDetalle.DataKeyNames = new string[] { "id_cd" };
            gvDetalle.DataBind();

            txtCodigoCD.Text = string.Empty;
            txtCodigoCD.BackColor = Color.LightGray;
            txtTitulo.Text = string.Empty;
            txtTitulo.BackColor = Color.LightGray;
            txtPrecio.Text = string.Empty;
            txtPrecio.BackColor = Color.LightGray;
            txtCantidad.Text = string.Empty;
            txtCantidad.BackColor = Color.LightGray;

            txtCantidad.Enabled = false;
            btnAgregar.Enabled = false;
            btnQuitar.Enabled = false;
            ViewState["id_cd"] = null;

            if (detallesEnSession.Count != 0)
            {
                btnConfirmar.Enabled = true;
            }
            else
            {
                btnConfirmar.Enabled = false;
            }
        }
    }

    protected void btnConfirmar_Click(object sender, EventArgs e)
    {
        if (!IsValid)
            return;

        alertaTipoFactura.Visible = false;
        alertaTipoPago.Visible = false;

        if ( detallesEnSession.Count != 0 && cboTipoFactura.SelectedIndex > 0 && cboTipoPago.SelectedIndex > 0)
        {
                        
            DateTime fecha = DateTime.Now;
            Entidad.EntidadFactura factura = new Entidad.EntidadFactura();
            factura.fecha = fecha;      
            factura.id_cliente = (int)ViewState["id_cliente"];
            factura.id_tipo_factura = int.Parse(cboTipoFactura.SelectedValue);
            factura.id_tipo_pago = int.Parse(cboTipoPago.SelectedValue);
            factura.setDetallesFactura(detallesEnSession);
            DAO.DAOFactura.Guardar(factura);
                       
            Nuevo();
            buscarGrillaCDs(0);
            cargarGrillaDetalles();
            ViewState["id_cliente"] = null;
            alertaExito.Visible = true;
            
        }
        else
        {
            if (cboTipoFactura.SelectedIndex <= 0)
                alertaTipoFactura.Visible = true;

            if (cboTipoPago.SelectedIndex <= 0)
                alertaTipoPago.Visible = true;
        }
    }

    //private void editarVenta(int id_factura)
    //{
    //    Nuevo();
    //    ViewState["id_factura"] = id_factura;
    //    Entidad.EntidadFactura factura = DAO.DAOFactura.Buscar(id_factura);
    //    List<Entidad.EntidadDetalleFactura> detalles = DAO.DAODetalleFactura.Buscar(id_factura);      
    //    foreach (Entidad.EntidadDetalleFactura item in detalles)
    //    {
    //        Entidad.EntidadCD cd = DAO.DAOCD.Buscar((int)item.id_cd);
    //        item.codigo_cd = cd.codigo_cd;
    //        item.titulo = cd.titulo;
    //        item.subtotal = item.precio * item.cantidad;                  
    //    }
    //    detallesEnSession = detalles;
    //    factura.setDetallesFactura(detalles);
    //    Entidad.EntidadCliente cliente = DAO.DAOCliente.Buscar((int)factura.id_cliente);
        
    //    if (factura != null)
    //    {            
    //        txtFecha.Text = factura.fecha.Value.ToShortDateString();
    //        txtNroFactura.Text = factura.id_factura.ToString();
    //        cboTipoFactura.SelectedValue = factura.id_tipo_factura.ToString();
    //        cboTipoPago.SelectedValue = factura.id_tipo_pago.ToString();

    //        txtNroDocumento.Text = cliente.numero_documento.ToString();
    //        txtApellido.Text = cliente.apellido.ToString();
    //        txtNombre.Text = cliente.nombre.ToString();
    //        BackColorCamposCliente(Color.White);
    //        ViewState["id_cliente"] = cliente.id_cliente;
            

    //        gvDetalle.DataSource = detallesEnSession;
    //        gvDetalle.DataKeyNames = new string[] { "id_cd" };
    //        gvDetalle.DataBind();         
    //        txtTotal.Text = factura.total.ToString().Replace(",", ".");
    //        btnConfirmar.Enabled = true;

    //    }

   
}